القائمة الرئيسية

الصفحات

الملفات ومعالجة الأخطاء في بايثون

مفهوم معالجة الأخطاء في بايثون

معالجة الأخطاء ( Exceptions Handling ) يقصد منها كتابة الكود الذي قد يسبب أي مشكلة في البرنامج بطريقة تضمن أنه إذا حدث الخطأ المتوقع أو أي خطأ آخر فإن البرنامج لن يعلّق أو يتم إغلاقه بشكل فجائي.

ظهور خطأ في البرنامج بشكل مفاجئ هو أمر سيئ جداً لأنه يؤدي إلى نفور عدد كبير من المستخدمين و عدم رغبتهم في العودة إلى استخدام هذا البرنامج مجدداً.


أنواع الأخطاء

  • أخطاء تظهر لك أثناء كتابة الكود. هذه الأخطاء يقال لها أخطاء لغوية ( Syntax Errors ).

  • أخطاء تحدث أثناء تشغيل البرنامج مما يؤدي إلى تعليقه و إيقافه بشكل غير طبيعي. هذه الأخطاء يقال لها إستثناءات ( Exceptions ).

  • أخطاء منطقية ( Logical Errors ), و يقصد منها أن الكود يعمل بدون أي مشاكل لكن نتيجة تشغيل هذا الكود غير صحيحة.

إذاً, أي خطأ برمجي يحدث معك أثناء تشغيل البرنامج يقال له إستثناء ( Exception ) حتى إن كان إسم الخطأ يحتوي على كلمة Error.
بمعنى آخر, أي Error يظهر لك أثناء تشغيل البرنامج يعتبر Exception.

في هذا الدرس ستتعلم كيف تتجنب حدوث أخطاء في البرامج التي تكتبها, و فعلياً ستتعلم كيف تجهز البرنامج للتعامل مع الأخطاء التي قد تحدث أثناء تشغيله لجعل البرنامج شغال دائماً في نظر المستخدم و لا يظهر له أي أخطاء.



بعض الأسباب التي تسبب حدوث إستثناء

  • في حال إدخال رقم index غير موجود في مصفوفة أو في متغير نصي.

  • في حال كان البرنامج يتصل بالشبكة و فجأةً إنقطع الإتصال.

  • في حال كان البرنامج يحاول قراءة معلومات من ملف نصي, و كان هذا الملف غير موجود.

أمثلة على أنواع الأخطاء في بايثون


مثال يتضمن خطأ لغوي ( Syntax Error )

في المثال التالي وضعنا قوس إضافي لدالة الطباعة, حيث أننا كتبنا print()) بدلاً من print().

مثال

Test.py
		x = 10
		print(x))
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

File "C:/Users/Mhamad/PycharmProjects/myapp/Test.py", line 2
    print(x))
            ^

SyntaxError: invalid syntax

ملاحظة

برنامج PyCharm يضع لك خطأ أحمر يوضح لك تماماً أين يوجد خطأ لغوي قبل تشغيل البرنامج.
في حال تشغيل البرنامج بدون إصلاح الخطأ ستجد أن مفسر لغة بايثون أيضاً يضع لك سهم أحمر ^ يخبرك أين وجد عندك خطأ لغوي في الكود عندما حاول تنفيذه.



أمثلة تتضمن أخطاء برمجية ( Exceptions )

في المثال التالي قمنا بطباعة قيمة متغير لم نقوم أصلاً بإعطاءه قيمة!
ملاحظة: هنا سيحدث الخطأ وقت التشغيل عندما يكتشف مفسّر لغة بايثون أن المتغير لا يحتوي على قيمة.

المثال الأول

Test.py
		print(x)
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

File "C:/Users/Mhamad/PycharmProjects/myapp/Test.py", line 1, in <module>

NameError: name 'x' is not defined

في المثال التالي قمنا بتعريف list إسمه aList, و يتألف من 4 عناصر.
بعدها حاولنا طباعة قيمة كل عنصر فيه و حاولنا طباعة قيمة عنصر غير موجود!
ملاحظة: هنا سيحدث الخطأ وقت التشغيل عندما يكتشف مفسّر لغة بايثون أنه لا يوجد عنصر يملك Index يساوي 4 في الكائن aList.

المثال الثاني

Test.py
		# و يتألف من 4 عناصر aList إسمه list هنا قمنا بتعريف
		aList = [10, 20, 30, 40]

		# list هنا قمنا بطباعة قيم عناصر الكائن
		print(aList[0])
		print(aList[1])
		print(aList[2])
		print(aList[3])

		# و هذا ما سيؤدي لحدوث خطأ برمجي وقت التشغيل list هنا قمنا بطباعة قيمة عنصر غير موجود أصلاً في الكائن
		print(aList[4])
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

10
20
30
40
File "C:/Users/Mhamad/PycharmProjects/myapp/Test.py", line 8, in <module>
    print(aList[4])

IndexError: list index out of range


مثال يتضمن خطأ منطقي ( Logical Error )

في المثال التالي قمنا بإنشاء برنامج يطبع للطالب ما إذا كان ناجحاً أو راسباً بناءاً على معدله النهائي.
من المفترض أنه يتم إعتبار الطالب راسب في حال كان معدله بين 0 و 9.9. و يتم إعتباره ناجح في حال كان معدله 10 و 20.
الخطأ المنطقي الذي وضعناه هو أننا عند طباعة نتيجة الطالب لم نتأكد ما إذا كان المعدل بين 0 كحد أدنى و 20 كحد أقصى.

مثال

Test.py
		average = 25

		if average < 10:
		print('The student failed the exam')

		elif average >= 10:
		print('The student passed the exam')
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

The student passed the exam

نلاحظ أنه لا يوجد مشكلة برمجية سببت إيقاف الكود لكننا نعلم أن هناك مشكلة منطقية في الكود.
المشكلة المنطقية هنا هي أن المعدل الذي تم على أساسه طباعة جملة النجاح هو معدل مستحيل أن يكون حقيقي.

الجمل try و except و finally و else في بايثون

نستخدم هذه الجمل للأسباب التالية:

  • أي كود تشك بأنه قد يسبب خطأ يجب وضعه بداخل بلوك الجملة try لضمان أن لا يعلق البرنامج أو يظهر خطأ مفاجئ أثناء التشغيل.

  • أي كود تريد تنفيذه لمعالجة الخطأ الذي حدث في الجملة try تضعه بداخل بلوك الجملة except.

  • أي كود تريد تنفيذه في حال لم يحدث خطأ في الجملة try تضعه بداخل بلوك الجملة else.

  • أي كود تريد تنفيذه سواء حدث أو لم يحدث خطأ في الجملة try تضعه بداخل بلوك الجملة finally.



معلومة تقنية

بمجرد أن تضع الكود بداخل try ستكون مجبراً على وضع الجملة except أو الجملة finally بعدها أو وضع كلا الجملتين.
كما أن برنامج PyCharm سيظهر لك تنتبيه بمجرد أن تضع الكود بداخل try يخبرك فيه أنك يجب أن تضع إحدى هاتين الجملتين بعدها.

بعد الجملة except يمكنك وضع الجملة finally أو الجملة else إن أردت لكن لا يمكنك وضع كلاهما في وقت واحد.

في حال كنت تكتب كود يمكن أن يسبب عدة أنواع من المشاكل, يمكنك وضع أكثر من جملة except حتى تعالج كل نوع من المشاكل التي قد تحدث على حدا.


إذاً في حال أردت استخدام الجمل try و except و finally سيكون شكل الكود كالتالي.

	  try:
	  # Something
	  except:
	  # Handle Errors
	  finally:
	  # Optional Clean Up Code
	


إذاً في حال أردت استخدام الجمل try و except و else سيكون شكل الكود كالتالي.

	  try:
	  # Something
	  except:
	  # Handle Errors
	  else:
	  # If No Errors, Do Extra Things
	


في المثال التالي إستخدمنا الجملتين try و except و لم نضع أي خطأ متعمد في الكود.
تذكر: بما أنه لن يحدث أي خطأ بداخل الجملة try فهذا يعني أنه لن يتم تنفيذ أي أمر موضوع في الجملة except.
بعدها سيتم إكمال تنفيذ أي أوامر موضوعة في البرنامج.

المثال الأول

Test.py
		x = 10

		# except و بما أنه لا يوجد أي مشكلة هنا فهذا يعني أنه لن يتم تنفيذ أمر الطباعة الموضوع في الجملة ,x حاولنا طباعة قيمة try في الجملة
		try:
		print('x =', x)
		except:
		print('An exception occurred')

		# سيتم تنفيذ أمر الطباعة التالي في حال كان البرنامج لا يوجد فيه أي مشكلة أو حدثت مشكلة سابقاً و تم معالجتها
		print('Program still work')
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

x = 10
Program still work


في المثال التالي إستخدمنا الجملتين try و except و وضعنا خطأ متعمد في الكود.
تذكر: بما أنه سيحدث خطأ بداخل الجملة try فهذا يعني أنه سيتم الإنتقال إلى الجملة except عند حدوث الخطأ.
بعدها, سيتم تنفيذ الأوامر الموضوعة فيها, و من ثم إكمال تنفيذ أي أوامر موضوعة في البرنامج.

المثال الثاني

Test.py
		# و الذي لم نخزن أي قيمة فيه بعد. بما أن هذا الأمر سيؤدي لحدوث خطأ x حاولنا طباعة قيمة try في الجملة
		# و تنفيذ أي أمر موضوع فيها except و الإنتقال إلى الجملة try فهذا يعني أنه سيتم الخروج من الجملة
		try:
		print('x =', x)
		except:
		print('An exception occurred')

		# سيتم تنفيذ أمر الطباعة التالي في حال كان البرنامج لا يوجد فيه أي مشكلة أو حدثت مشكلة سابقاً و تم معالجتها
		print('Program still work')
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

An exception occurred
Program still work


في المثال التالي إستخدمنا الجملتين try و except و وضعنا خطأ متعمد في الكود.
ملاحظة: هنا توقعنا حدوث خطأ محدد و إمكانية حدوث أي خطأ آخر.

المثال الثالث

Test.py
		# و الذي لم نخزن أي قيمة فيه بعد و بالتالي سيحدث خطأ x حاولنا طباعة قيمة try في الجملة
		try:
		print('x =', x)

		# سيتم تنفيذ الكود التالي - NameError إذا كان سبب الخطأ هو محاولة عرض قيمة متغير لم يتم تعريفه سابقاً - أي خطأء من النوع
		except NameError:
		print('x is not defined')

		# سيتم تنفيذ الكود التالي - NameError إذا كان سبب الخطأ هو خطأ من أي نوع آخر - غير النوع
		except:
		print('An exception occurred')

		# سيتم تنفيذ أمر الطباعة التالي في حال كان البرنامج لا يوجد فيه أي مشكلة أو حدثت مشكلة سابقاً و تم معالجتها
		print('Program still work')
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

x is not defined
Program still work


في المثال التالي إستخدمنا الجمل الثلاثة try و except و finally و لم نضع أي خطأ متعمد في الكود.
تذكر: الجملة finally يتم تنفيذ أي أمر موضوع فيها سواء حدث خطأ أو لم يحدث.

المثال الرابع

Test.py
		x = 10

		try:
		print('x =', x)

		except:
		print('An exception occurred')

		# try سيتم تنفيذه في حال حدوث أو عدم حدوث خطأ في الجملة finally أي أمر موضوع في الجملة
		finally:
		print('Finally block always executed')

		# سيتم تنفيذ أمر الطباعة التالي في حال كان البرنامج لا يوجد فيه أي مشكلة أو حدثت مشكلة سابقاً و تم معالجتها
		print('Program still work')
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

x = 10
Finally block always executed
Program still work


في المثال التالي إستخدمنا الجمل الثلاثة try و except و else و لم نضع أي خطأ متعمد في الكود.
تذكر: الجملة else يتم تنفيذ أي أمر موضوع فيها سواء لم يحدث خطأ فقط.

المثال الخامس

Test.py
		x = 10

		try:
		print('x =', x)

		except:
		print('An exception occurred')

		# try يتم تنفيذها فقط في حال عدم حدوث خطأ في الجملة else الأوامر التي نضعها في الجملة
		else:
		print('Else block executed only when no exception occurred')

		# سيتم تنفيذ أمر الطباعة التالي في حال كان البرنامج لا يوجد فيه أي مشكلة أو حدثت مشكلة سابقاً و تم معالجتها
		print('Program still work')
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

x = 10
Else block executed only when no exception occurred
Program still work

الإستثناءات الجاهزة في بايثون

تم تقسيم الإستثناءات أو الأخطاء الأساسية في بايثون إلى عدة أنواع و كل نوع تم تمثيله في كلاس خاص.
جميع هذه الكلاسات ترث من كلاس أساسي إسمه BaseException.
و هذا يعني أنك إذا أردت تعريف إستثناء خاص فيك في المستقبل سيكون عليك إنشاء كلاس يرث من هذا الكلاس أو من إحدى الكلاسات التي ترث منه.

إذاً, أي كلاس يرث من الكلاس BaseException هو كلاس يمثل إستثناء معين.

	  BaseException
	  +-- SystemExit
	  +-- KeyboardInterrupt
	  +-- GeneratorExit
	  +-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
      |    +-- ImportError
      |    +-- LookupError
      |    |    +-- IndexError
      |    |    +-- KeyError
      |    +-- MemoryError
      |    +-- NameError
      |    |    +-- UnboundLocalError
      |    +-- ReferenceError
      |    +-- RuntimeError
      |    |    +-- NotImplementedError
      |    +-- SyntaxError
      |    |    +-- IndentationError
      |    |         +-- TabError
      |    +-- SystemError
      |    +-- TypeError
      |    +-- ValueError
      |         +-- UnicodeError
      |              +-- UnicodeDecodeError
      |              +-- UnicodeEncodeError
      |              +-- UnicodeTranslateError
      +-- Warning
	  +-- DeprecationWarning
	  +-- PendingDeprecationWarning
	  +-- RuntimeWarning
	  +-- SyntaxWarning
	  +-- UserWarning
	  +-- FutureWarning
	  +-- ImportWarning
	  +-- UnicodeWarning
	  +-- BytesWarning
	

طباعة رسالة الخطأ الذي حدث في بايثون

عندما يحدث خطأ في الجملة try, يقوم مفسر بايثون ينشئ كائن يمثل نوع الخطأ الذي حدث في هذه الجملة.
بعدها يمر على كل جملة except موضوعة بعدها, و يقارن نوع الكائن الذي تم إنشاؤه في الجملة try مع نوع الخطأ ( الذي هو في الأصل عبارة عن إسم الكلاس الذي يمثل الخطأ المتوقع حصوله ) الذي تعامله كل جملة except حتى يجد الجملة التي تعالج هذا النوع من الأخطاء و ينفذ الأوامر الموضوعة فيها.

الآن, في حال أردت طباعة رسالة الخطأ الذي حدث في الجملة try و التي بدورها أرسلته إلى الجملة except فكل ما عليك فعله هو إستقبال رسالة الخطأ من هذا الكائن و وضعها في متغير بواسطة الكلمة المفتاحية as.



المثال التالي يعلمك طريقة طباعة رسالة الخطأ الجاهزة في الكائن الذي يمثل الخطأ المحدد الذي قد يحدث.

المثال الأول

Test.py
		# لأننا حاولنا طباعة قيمة متغير لا يملك قيمة أصلاً NameError الكود هنا يسبب خطأ من النوع
		try:
		print('x =', x)

		# و من ثم عرضها msg سيتم تخزين رسالة الخطأ الجاهزة في هذا الكائن و وضعها بشكل مؤقت في المتغير NameError هنا قلنا أن أي خطأ نوعه
		except NameError as msg :
		print('Error Message:', msg)

		# سيتم تنفيذ أمر الطباعة التالي في حال كان البرنامج لا يوجد فيه أي مشكلة أو حدثت مشكلة سابقاً و تم معالجتها
		print('Program still work')
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

Error Message: name 'x' is not defined
Program still work


المثال التالي يعلمك طريقة طباعة رسالة الخطأ الجاهزة مهما كان نوع الخطأ الذي حدث في الجملة try.
ملاحظة: قمنا بإعادة نفس المثال السابق مع تبديل الكلاس NameError بالكلاس BaseException.
الفكرة لأساسية هنا هي أنه بما أن الكلاس BaseException يعتبر الكلاس الأساسي لأي خطأ قد يحدث, فهذا يعني أنه يمكننا إعتبار الخطأ الذي حدث عبارة عن كائن منه لأنه سيكون من كلاس يرث منه.

المثال الثاني

Test.py
		# لأننا حاولنا طباعة قيمة متغير لا يملك قيمة أصلاً NameError الكود هنا يسبب خطأ من النوع
		try:
		print('x =', x)

		# و من ثم عرضها msg سيتم تخزين رسالة الخطأ الجاهزة في هذا الكائن و وضعها بشكل مؤقت في المتغير NameError هنا قلنا أن أي خطأ نوعه
		except BaseException as msg :
		print('Error Message:', msg)

		# سيتم تنفيذ أمر الطباعة التالي في حال كان البرنامج لا يوجد فيه أي مشكلة أو حدثت مشكلة سابقاً و تم معالجتها
		print('Program still work')
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

Error Message: name 'x' is not defined
Program still work

الكلمة المفتاحية raise في بايثون

في حال أردت بناء دالة ترمي إستثناء في حال حدوث خطأ معين, كل ما عليك فعله هو جعل هذه الدالة تفعل raise لكائن من الكلاس Exception يحتوي على رسالة الخطأ التي تريد إظهارها.



في المثال التالي قمنا ببناء دالة ترمي إستثناء في حال تم تمرير قيمة أصغر من 0 لها عند استدعاءها.
بعدها قمنا باستدعاء الدالة و تمرير قيمة أصغر من 0 لها فتسبب ذلك بإيقاف البرنامج.

المثال الأول

Test.py
		# تأخذ قيمة عند استدعاءها func هنا قمنا بتعريف دالة إسمها
		# إذا تم تمرير قيمة أصغر من 0 لها, ترمي إستثناء. غير ذلك تطبع القيمة التي تم تمريرها لها
		def func(x):
		if x < 0:
        raise Exception("Error: Passed value can't be negative")

		print(x, "Acceptable value")


		# و تمرير قيمة أكبر من 0 لها. نلاحظ أنها تقوم بطباعتها و لا يسبب ذلك أي مشكلة في الكود func() هنا قمنا باستدعاء الدالة
		func(5)

		# و تمرير قيمة أصغر من 0 لها. نلاحظ أن هذا الأمر سبب مشكلة في الكود و أدى إلى إيقاف البرنامج func() هنا قمنا باستدعاء الدالة
		func(-1)

		# سيتم تنفيذ أمر الطباعة التالي في حال كان البرنامج لا يوجد فيه أي مشكلة أو حدثت مشكلة سابقاً و تم معالجتها
		print('Program still work')
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

5 Acceptable value
File "C:/Users/Mhamad/PycharmProjects/myapp/Test.py", line 14, in <module>
    func(-1)
File "C:/Users/Mhamad/PycharmProjects/myapp/Test.py", line 5, in func
    raise Exception("Error: Passed value can't be negative")

Exception: Error: Passed value can't be negative


في المثال التالي قمنا ببناء دالة ترمي إستثناء في حال تم تمرير قيمة أصغر من 0 لها عند استدعاءها.
بعدها قمنا باستدعاء الدالة بداخل بلوك try مع تمرير قيمة أصغر من 0 لها و من ثم معالجة الخطأ الذي ستسببه بداخل بلوك except.

المثال الثاني

Test.py
		# تأخذ قيمة عند استدعاءها func هنا قمنا بتعريف دالة إسمها
		# إذا تم تمرير قيمة أصغر من 0 لها, ترمي إستثناء. غير ذلك تطبع القيمة التي تم تمريرها لها
		def func(x):
		if x < 0:
        raise Exception("Error: Passed value can't be negative")

		print(x, "Acceptable value")


		# مرتين func() هنا قمنا بمحاولة إستدعاء الدالة
		try:
		func(5)
		func(-1)

		# هنا قمنا بالتقاط أي خطأ قد يحدث سببه أن القيمة التي تم تمريرها للدالة أصغر من 0, و من ثم طباعة رسالة الخطأ
		except Exception as msg:
		print(msg)


		# سيتم تنفيذ أمر الطباعة التالي في حال كان البرنامج لا يوجد فيه أي مشكلة أو حدثت مشكلة سابقاً و تم معالجتها
		print('Program still work')
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.

5 Acceptable value
Error: Passed value can't be negative
Program still work

معالجة الملفات في بايثون

التعامل مع الملفات أو معالجة الملفات ( Files Handling ) يقصد منها إجراء عملية ما على الملفات على مختلف انواعها ( مثل txt - jpg - mp4 ).
في هذا الدرس ستتعلم كيف تقرأ محتوى ملف, كيف تنشئ نسخة منه, كيف تعدل محتواه, كيف تحذفه إلخ..

الدالة open() في بايثون

هذه الدالة هي من الدوال الجاهزة في بايثون و هي تستخدم لإنشاء ملف جديد أو لفتح الملف الذي سيتم التعامل معه.
في حال تم إنشاء الملف بشكل صحيح أو تم فتح الملف بشكل صحيح ترجع كائن file يتيح لك التعامل معه.
في حال لم تستطع إنشاء الملف أو الوصول إليه ترمي إستثناء.


بناؤها

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None)
	

  • مكان البارميتر file نمرر نص يمثل إسم الملف الذي سيتم إنشاؤه أو التعامل معه.

  • mode هو باراميتر إختياري, نمرر مكانه حرف ( أو أكثر ) يمثل كيف سنتعامل مع الملف, مثل: هل تنوي القراءة منه أو الكتابة فيها إلخ..

  • buffering هو باراميتر إختياري, يمكنك أن تمرر مكانه رقم يحدد كيف سيتم تخزين الأحرف بشكل مؤقت في الذاكرة أثناء الكتابة أو القراءة من الملف.

  • encoding هو باراميتر إختياري, يمكنك أن تمرر مكانه إسم الترميز الذي يجب استخدامه عند التعامل مع الملف.

  • errors هو باراميتر إختياري, يمكنك أن تمرر مكانه كلمة لتحدد كيف سيتم التعامل مع الأخطاء التي قد تحدث عند التعامل مع الملف.

  • newline هو باراميتر إختياري, يمكنك أن تمرر مكانه الرمز الذي يمثل نهاية كل سطر في الملف و الذي يجعل النص الذي يوضع بعضه ينزل على سطر جديد.



أهم باراميتر إختياري في هذه الدالة هو الباراميتر mode لأنه كما سبق و قلنا أن الحرف الذي نمرره مكانه يحدد الهدف من فتح الملف.
في الجدول التالي وضعنا كل الحروف التي يمكن تمريرها مكان هذا الباراميتر.

الحرف معناه مثال
'r' يعتبر إختصار للكلمة Read, و هو يستخدم لفتح الملف من أجل القراءة منه.
كما أنه الـ Mode الإفتراضي للملف الذي تفتحه.
شاهد المثال »
'w' يعتبر إختصار للكلمة Write, و هو يستخدم لفتح الملف من أجل الكتابة فيه.
و في حال لم يكن الملف المراد الكتابة فيه موجوداً أصلاً, سيتم إنشاؤه.
ملاحظة: هذا الحرف يقوم بحذف النص الذي كان موجوداً في الملف في حال لم يكن فارغاَ.
شاهد المثال »
'a' يعتبر إختصار للكلمة Append, و هو يستخدم لفتح الملف من أجل الكتابة في آخره. أي لإضافة نص جديد على النص الموجود في الملف.
و في حال لم يكن الملف المراد الكتابة فيه موجوداً أصلاً, سيتم إنشاؤه.
شاهد المثال »
'x' يعتبر إختصار للكلمة Create, و هو يستخدم لإنشاء ملف جديد فقط في حال لم يكن موجوداً. شاهد المثال »
't' يعتبر إختصار للكلمة Text, و هو يستخدم لتحديد أن محتوى الملف عبارة عن نص عادي.
كما أنه الـ Mode الإفتراضي للملف الذي تفتحه.
شاهد المثال »
'b' يعتبر إختصار للكلمة Binary, و هو يستخدم لتحديد أن محتوى الملف عبارة عن Binary, أي أحرف لا يمكن أن يفهمها الإنسان العادي.
هذا الـ Mode نستخدمه عند التعامل مع الملفات الغير نصية مثل الصور, الفيدوهات, التسجيلات الصوتية إلخ..
ملاحظة: المثال سيعلمك طريقة إنشاء نسخة من أي ملف.
شاهد المثال »
'+' يعتبر إختصار للكلمتين Read & Write, و هو يستخدم لفتح الملف مع إمكانية القراءة منه و الكتابة فيه في نفس الوقت. شاهد المثال »

ملاحظة

الأحرف المذكورة في الجدول يمكن دمجها مع بعضها, أي يمكنك تحديد أكثر من Mode في وقت واحد.
فمثلاً يمكنك كتابة 'wb' من أجل فتح ملف جديد و وضع فيه نص نوعه Binary كما نفعل في حال أردنا نسخ صورة على سبيل المثال.


في المثال التالي قمنا بإنشاء ملف نصي جديد إسمه demo.txt في نفس المشروع الذي نعمل فيه.
بعدها قمنا كتابة السطر التالي بداخله Python is an easy language to learn..

مثال

Test.py
# لكي يتم إنشاء الملف و لنستطيع الكتابة فيه أيضاً 'w' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'w')

		# للكتابة في الملف الذي يشير إليه opened_file من الكائن write() هنا قمنا باستدعاء الدالة
		opened_file.write('Python is an easy language to learn.')

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم إنشاء ملف إسمه demo.txt في نفس المشروع الذي نعمل فيه و بداخله النص التالي.

Python is an easy language to learn.

دوال القراءة و الكتابة في الملفات في بايثون

بعد فتح الملف الذي تريد التعامل معه بنجاح بواسطة الدالة open() يصبح بإمكانك استخدام الدوال التالية من الكائن الذي سترجعه هذه الدالة.

إسم الدالة مع تعريفها
write(string) تستخدم للكتابة في الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.
مكان الباراميتر string نمرر النص الذي نريد أن يتم كتابته في الملف.
شاهد المثال »
writelines(aList) تستخدم لكتابة مجموعة نصوص مخزنة في list في الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.
مكان الباراميتر lines نمرر كائن aList فيه مجموعة النصوص التي نريد أن يتم كتابتها بنفس الترتيب في الملف.
شاهد المثال »
read(n = -1) تستخدم للقراءة من الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.
إذا قمت باستدعائها و لم تمرر لها أي رقم, سترجع كل النص الموجود في الملف دفعة واحد.
n هو باراميتر إختياري يمكنك أن تمرر مكانه رقم يمثل عدد الأحرف التي تريد قراءتها من الملف في حال لم ترد أن تقرأ كل محتوى الملف دفعة واحدة. مع الإشارة إلى أنك في كل مرة تقوم فيها باستدعائها ستعطيك الأحرف التالية الموجودة في الملف.
شاهد المثال »
readline(limits = -1) تستخدم للقراءة سطراً سطراً من الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.
إذا قمت باستدعائها و لم تمرر لها أي رقم, سترجع السطر التالي الموجود في الملف.
n هو باراميتر إختياري يمكنك أن تمرر مكانه رقم يمثل عدد الأحرف التي تريد قراءتها من السطر التالي في الملف في حال لم ترد أن تقرأ كل محتوى السطر دفعة واحدة. مع الإشارة إلى أنك في كل مرة تقوم فيها باستدعائها ستعطيك الأحرف الموجودة حتى نهاية السطر الحالي في الملف.
شاهد المثال »
readlines(limits = -1) تستخدم لإرجاع نسخة من النص الموجود في الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها ككائن list.
كل عنصر في كائن الـ list الذي ترجعه يمثل سطر موجود في الملف.
إذا قمت باستدعائها و لم تمرر لها أي رقم, سيتم وضع كل الأحرف الموجودة على كل سطر في الملف في عنصر من عناصر الكائن الـ list.
n هو باراميتر إختياري يمكنك أن تمرر مكانه رقم يمثل عدد الأحرف التي تريد قراءتها من كل سطر في الملف في حال لم ترد أن تقرأ كل محتوى السطر.
شاهد المثال »
tell() ترجع رقم آخر حرف في الملف تم الوصول إليه أثناء القراءة من الملف عن طريق الكائن الذي يمثل هذا الملف.
شاهد المثال »
seek(offset, from_what=0) أثناء القراءة من الملف عن طريق الكائن الذي يمثل هذا الملف, يمكنك إستخدام هذه الدالة في حال أردت الرجوع إلى الوراء في الملف لقراءة الملف من جديد على سبيل المثال.
from_what هو باراميتر إختياري يمكنك أن تمرر إحدى الأرقام التالية مكانه:
  • الرقم 0 إذا أردت الرجوع إلى أول حرف في الملف.

  • الرقم 1 إذا أردت البقاء عند حرف الحالي الذي وصلت إليه في الملف.

  • الرقم 2 إذا أردت الذهاب إلى آخر حرف في الملف.

مكان الباراميتر offset تمرر رقم يمثل بعد كم حرف نسبة للبراميتر from_what تريد أن تبدأ.
مثال: إذا قمت باستدعاء الدالة هكذا seek(0,0) أو هكذا seek(0) فهذا يعني أنك تريد العودة إلى أول حرف في الملف.
شاهد المثال »
close() تستخدم لإغلاق الإتصال مع الملف و تنظيف الذاكرة من كل ما له علاقة بهذا الملف.
ملاحظة: في حال قمت بفتح الملف بالأساس بواسطة الجملة with فلا داعي لإغلاق الملف لأنها تقوم بإغلاقه بشكل تلقائي عنك.
شاهد المثال »

خصائص الملفات في بايثون

بالإضافة إلى الدوال السابقة, يصبح بإمكانك الإستفادة من الخصائص التالية من الكائن الذي ترجعه الدالة open().

إسم الخاصية مع تعريفها
name ترجع إسم الملف الذي يمثله الكائن.
mode ترجع الحرف أو الأحرف المستخدمة لتحديد الهدف من فتح الملف.
encoding ترجع إسم الترميز المستخدم في الملف الذي يمثله الكائن.
closed تستخدم لمعرفة ما إذا كان الكائن الذي يمثل الملف لا يزال مفتوح أم تم إغلاقه.
ترجع True إن كان كذلك, إن لم يكن كذلك ترجع False.


في المثال التالي قمنا بإنشاء كائن يشير للملف demo.txt الذي أنشأناه سابقاً.
بعدها قمنا بعرض خصائص هذا الكائن و التي بدورها تعتبر خصائص الملف نفسه.

مثال

Test.py
# 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt')

		# الذي يشير للملف المفتوح في الذاكرة opened_file هنا قمنا بعرض كل خصائص الكائن
		print('File Name:', opened_file.name)
		print('Access Mode:', opened_file.mode)
		print('Encoding Type:', opened_file.encoding)
		print('Is File closed:', opened_file.closed)

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

سنحصل على النتيجة التالية عند تشغيل الملف Test.py.

File Name: demo.txt
Access Mode: w
Encoding Type: cp1252
Is File closed: False

الموديول os في بايثون

os هو موديول جاهز في بايثون يتيح لك إعادة تسمية الملفات, مسح الملفات, إنشاء مجلدات, مسح مجلدات, التنقل بين المجلدات إلخ..

لإستخدام هذا الموديول يجب تضمينه كالتالي.

import os
	


الجدول التالي يحتوي على دوال الموديول os الأكثر استخداماً.

إسم الدالة مع تعريفها
os.rename(current_file_name, new_file_name) تستخدم لتغيير إسم الملف.
مكان الباراميتر current_file_name نمرر إسم الملف الذي نريد تغيير إسمه.
مكان الباراميتر new_file_name نمرر الإسم الجديد الذي نريد وضعه للملف.
شاهد المثال »
os.remove(file_name) تستخدم لمسح الملف.
مكان الباراميتر file_name نمرر إسم الملف الذي نريد حذفه.
شاهد المثال »
os.path.exists(file_name) تستخدم لمعرفة ما إن كان الملف موجوداً أم لا.
مكان الباراميتر file_name نمرر إسم الملف الذي نريد التأكد ما إن كان موجوداً أم لا.
ترجع True إذا كان الملف موجوداً. و ترجع False إن لم يكن كذلك.
شاهد المثال »
os.mkdir(directory_name) تستخدم لإنشاء مجلد جديد.
مكان الباراميتر directory_name نمرر إسم المجلد الذي نريد إنشاؤه.
معلومة: إسم الدالة هو إختصار لجملة Make Directory.
شاهد المثال »
os.rmdir(directory_name) تستخدم لمسح المجلد.
مكان الباراميتر directory_name نمرر إسم المجلد الذي نريد حذفه.
ملاحظة: يمكنك حذف المجلد في حال كان فارغاً فقط, أي في حال لم يكن يحتوي على أي ملف بداخله.
معلومة: إسم الدالة هو إختصار لجملة Remove Directory.
شاهد المثال »
os.getcwd() تستخدم لمعرفة إسم المجلد الذي تقف بداخله حالياً.
معلومة: إسم الدالة هو إختصار لجملة Get Current Working Directory.
شاهد المثال »

البلوك with في بايثون

يمكنك الإستفادة من إستخدام أسلوب البلوك with في حال أردت أن يتم إغلاق الملفات التي تفتحها في برامجك بشكل تلقائي و بدون الحاجة لإستدعاء الدالة close().


طريقة تعريف البلوك with:

with expression [as variable]:
	  #with-block
	

  • expression: نضع مكانه الأمر الذي سيرجع لنا كائن يشير الملف الذي تم فتحه في الذاكرة.

  • variable: نضع مكانه إسم الكائن الذي نريد من خلاله أن نتعامل مع الملف الذي تم فتحه في الذاكرة.

  • #with-block: مكان هذا التعليق نضع الأوامر التي نريد تنفيذها بعد أن تم فتح الملف بنجاح.



في المثال التالي قمنا بفتح ملف و قراءة النص الموجود فيه بدون الحاجة لإغلاقه عند الإنتهاء منه لأننا وضعنا الكود بداخل بلوك الكلمة with.

مثال

Test.py
# بعدها قمنا بطباعة النص الموجود فيه 'demo.txt' يشير للملف opened_file هنا قمنا بإنشاء كائن إسمه
		with open('demo.txt', 'r') as opened_file:
		print(opened_file.read())

		# هنا قمنا بطباعة ما إن كان الملف لا يزال مفتوحاً في الذاكرة أم أنه تم إغلاقه
		print('Is File Closed:', opened_file.closed)
	  

بعد تشغيل الملف Test.py سيتم طباعة كل النص الموجود في الملف demo.txt الذي إفترضنا أننا أنشأناه سابقاً في نفس المشروع الذي نعمل فيه.
نلاحظ أن الدالة closed() أرجعت القيمة True و هذا يعني أنه تم إغلاق الملف من الذاكرة بشكل تلقائي عند إنتهاء البلوك with.

Python is an easy language to learn.
Is File Closed: True

تخزين أحرف عربية في الملف في بايثون

إذا حاولت كتابة أحرف عربية في ملف و لم تحدد أن نوع الترميز المستخدم عند التعامل مع الملف هو utf-8 سيظهر أمامك الخطأ 'charmap' codec can't encode.
و إذا حاولت قراءة نص عربي موجود في ملف و لم تحدد نوع الترميز ستلاحظ أن النص يظهر بشكل غير مفهوم كالتالي السلام عليكم.


في المثال التالي قمنا بإنشاء ملف إسمه arabic.txt قمنا بتخزين نص عربي فيه و بعدها قمنا بقراءة النص الموجود فيه.

مثال

Test.py
# 'Test.py' سيتم إنشاؤه في نفس المشروع بجانب الملف 'arabic.txt' يشير لملف جديد إسمه opened_file هنا قمنا بإنشاء كائن إسمه
		# لنستطيع التعامل مع الأحرف العربية 'utf-8' حتى يتم إنشاء الملف و يكون لدينا القدرة على الكتابة و القراءة منه في نفس الوقت. كما أننا حددنا نوع الترميز هو 'w+' وضعنا الرمز
		opened_file = open('arabic.txt', 'w+', encoding='utf-8')

		# لكتابة نص جديد في الملف الذي يشير إليه و لاحظ أننا أدخلنا نص عربي  opened_file من الكائن write() هنا قمنا باستدعاء الدالة
		opened_file.write('السلام عليكم و رحمة الله و بركاته')

		# للعودة لأول الملف seek() هنا قمنا باستدعاء الدالة
		opened_file.seek(0,0)

		# الذي يشير للملف المفتوح حتى ترجع كل النص الموجود فيه, بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
		print(opened_file.read())

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم إنشاء الملف arabic.txt و تخزين النص العربي بداخله. أيضاً سيتم طباعة النص العربي الموجود في الأساس بداخل الملف كالتالي.

السلام عليكم و رحمة الله و بركاته

التعامل مع الملفات بطريقة آمنة في بايثون

عند التعامل مع الملفات قد تواجهك عدة مشاكل قد يكون سببها نظام التشغيل أو المستخدم.
لذلك عليك دائماً حماية الكود الذي من خلاله ستتعامل مع الملفات بالجمل try.. except التي شرحناها سابقاً.


بعض المشاكل التي قد تحدث معك أثناء التعامل مع الملفات:

  • إذا كان مسار الملف الذي تريد التعامل معه مذكور بشكل غير صحيح.

  • إذا كنت تحاول قراءة محتوى ملف غير موجود أصلاً أو تم مسحه.

  • إذا كنت تريد الكتابة بالعربية و لم تحدد أن نوع الترميز الذي يجب أن يستخدم هو 'utf-8'.

  • إذا كنت تحاول التعامل مع صورة أو فيديو و لم تحدد أن نوع هذا الملف هو Binary كما شرحنا قبل قليل.

  • إذا كان الملف عليه صلاحية القراءة فقط ( Read Only ) لا يمكنك تعديل النص الموجود فيه بأي شكل أو مسح الملف نفسه من الحاسوب.

  • في حال كنت تريد إنشاء مجلد أو ملف و لم تكن تملك الصلاحيات التي تخولك لذلك. فمثلاً في نظام ويندوز لا تستطيع إنشاء ملف على المسار C:\ إذا لم تكن تملك صلاحيات مدير النظام.


في المثال التالي سنقوم بفتح الملف و التعامل معه بداخل بلوك try.. except لضمان أن لا تحدث أي مشكلة تؤدي إلى تعليق البرنامج و لعرض أي خطأ قد يحدث أيضاً.

المثال الأول

Test.py
# من أجل عرض النص الموجود فيه 'harmash.txt' هنا حاولنا إيجاد و فتح ملف إسمه
		try:
		opened_file = open('harmash.txt', 'r')
		print(opened_file.read())
		opened_file.close()

		# و من ثم عرضها كنص عادي ex بما أنه لا يوجد هكذا ملف في المشروع, سيتم تخزين معلومات الخطأ الذي حدث في الكائن
		except Exception as ex:
		print(ex)

		print('Program still work properly')
	  

بعد تشغيل الملف Test.py سيتم طباعة المشكلة التي حدثت أثناء محاولة القراءة من الملف كنص عادي و لن يؤدي ذلك إلى تعليق البرنامج.

[Errno 2] No such file or directory: 'harmash.txt'
Program still work properly


هنا قمنا بإعادة المثال السابق تماماً لكننا حاولنا فتح الملف بوسطة البلوك with.
لاحظ أن النتيجة هي نفسها في الحالتين.

المثال الثاني

Test.py
# من أجل عرض النص الموجود فيه 'harmash.txt' هنا حاولنا إيجاد و فتح ملف إسمه
		try:
		with open('harmash.txt', 'r') as opened_file:
		print(opened_file.read())

		# و من ثم عرضها كنص عادي ex بما أنه لا يوجد هكذا ملف في المشروع, سيتم تخزين معلومات الخطأ الذي حدث في الكائن
		except Exception as ex:
		print(ex)

		print('Program still work properly')
	  

بعد تشغيل الملف Test.py سيتم طباعة المشكلة التي حدثت أثناء محاولة القراءة من الملف كنص عادي و لن يؤدي ذلك إلى تعليق البرنامج.

[Errno 2] No such file or directory: 'harmash.txt'
Program still work properly

 طريقة قراءة النص الموجود في ملف في بايثون

تذكر: الرمز r الذي نضعه في الدالة open() يعتبر إختصار للكلمة Read, و هو يستخدم لفتح الملف من أجل القراءة منه.
كما أنه الـ Mode الإفتراضي للملف الذي تفتحه.


مثال

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن للقراءة من الملف 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'r')

		# الذي يشير للملف المفتوح حتى ترجع النص الموجود فيه, بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
		print(opened_file.read())

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم قراءة محتوى الملف demo.txt و من ثم عرضه كالتالي.

Python is an easy language to learn.     <-- هنا افترضنا أن هذا النص كان موجوداً أصلاً في الملف

 طريقة تخزين النص في ملف في بايثون

تذكر: الرمز w الذي نضعه في الدالة open() يعتبر إختصار للكلمة Write, و هو يستخدم لفتح الملف من أجل الكتابة فيه.
و في حال لم يكن الملف المراد الكتابة فيه موجوداً أصلاً, سيتم إنشاؤه.
و لا تنسى أن هذا الحرف يقوم بحذف النص الذي كان موجوداً في الملف في حال لم يكن فارغاَ.


مثال

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لكتابة نص جديد في الملف 'w' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'w')

		# لكتابة نص جديد في الملف الذي يشير إليه opened_file من الكائن write() هنا قمنا باستدعاء الدالة
		opened_file.write('This new text will replace the old text.')

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم إنشاء ملف إسمه demo.txt في نفس المشروع الذي نعمل فيه و بداخله النص التالي.

This new text will replace the old text.

 طريقة إضافة نص جديد على النص الموجود في ملف في بايثون

تذكر: الرمز a الذي نضعه في الدالة open() يعتبر إختصار للكلمة Append, و هو يستخدم لفتح الملف من أجل الكتابة في آخره.
أي يستخدم لإضافة نص جديد على النص الموجود في الملف.
و في حال لم يكن الملف المراد الكتابة فيه موجوداً أصلاً, سيتم إنشاؤه.


مثال

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لإضافة نص جديد على النص الموجود في الملف 'a' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'a')

		# لإضافة نص جديد في الملف الذي يشير إليه opened_file من الكائن write() هنا قمنا باستدعاء الدالة
		opened_file.write('\nThis new text')

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

إذا قمت بتشغيل الملف Test.py و لم يحدث أي مشكلة, ستجد أن الملف demo.txt أضيف فيه النص "This new text" على سطر جديد.

Old text in the file.     <-- إذا أفترضنا أن هذا النص كان موجوداً في الملف
This new text             <-- سيتم إضافة السطر التالي في آخر الملف كالتالي

 طريقة إنشاء ملف جديد في بايثون

تذكر: الرمز x الذي نضعه في الدالة open() يعتبر إختصار للكلمة Create, و هو يستخدم لإنشاء ملف جديد فقط في حال لم يكن موجوداً.


مثال

Test.py
                    # للإشارة إلى أننا نريد إنشاء هذا الملف في حال لم يكن موجوداً أصلاً 'x' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء ملف جديد إسمه
		open('demo.txt', 'x')
	  

بعد تشغيل الملف Test.py سيتم إنشاء ملف فارغ إسمه demo.txt في نفس المشروع الذي نعمل فيه.
في حال كان يوجد ملف إسمه demo.txt في نفس المشروع الذي نعمل فيه سيظهر لك الخطأ التالي.

FileExistsError: [Errno 17] File exists: 'demo.txt'

 طريقة قراءة النص الموجود في ملف نصي في بايثون

تذكر: الرمز t الذي نضعه في الدالة open() يعتبر إختصار للكلمة Text, و هو يستخدم لتحديد أن محتوى الملف عبارة عن نص عادي.
كما أنه الـ Mode الإفتراضي للملف الذي تفتحه لهذا لا داعي لذكره إذا كنت ستتعامل مع ملف نصي.


مثال

Test.py
                    # لتحديد أن نوع الملف هو ملف نصي 't' للإشارة إلى أننا سنستخدم هذا الكائن للقراءة من الملف, و وضعنا الرمز 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'rt')

		# الذي يشير للملف المفتوح حتى ترجع النص الموجود فيه, بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
		print(opened_file.read())

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم قراءة محتوى الملف demo.txt و من ثم عرضه كالتالي.

Python is an easy language to learn.     <-- هنا افترضنا أن هذا النص كان موجوداً أصلاً في الملف

 طريقة إنشاء نسخة من صورة أو فيديو في بايثون

تذكر: الرمز b الذي نضعه في الدالة open() يعتبر إختصار للكلمة Binary, و هو يستخدم لتحديد أن محتوى الملف عبارة عن Binary, أي أحرف لا يمكن أن يفهمها الإنسان العادي.
هذا الـ Mode نستخدمه عند التعامل مع الملفات الغير نصية مثل الصور, الفيدوهات, التسجيلات الصوتية إلخ..


ملاحظة: في المثال التالي إفترضنا أنك وضعت صورة في المشروع إسمها logo.png بجانب الملف Test.py.
لإضافة أي صورة في المشروع بشكل يدوية, يمكنك نسخ الصورة من حاسوبك و من ثم إلصاقها في المشروع ( Copy / Paste ).

مثال

Test.py
                    # و الذي يمثل الصورة التي نريد أن ننسخ محتواها 'logo.png' هنا قمنا بإنشاء كائن يشير لملف إسمه
		# لتحديد أننا نتعامل مع ملف غير نصي 'b' للإشارة إلى أننا سنستخدم هذا الكائن للقراءة من الملف, و وضعنا الرمز 'r' وضعنا الرمز 
		existing_file = open('logo.png', 'rb')

		# و الذي يمثل الصورة الجديدة التي سيتم إنشاءها و نسخ المحتوى فيها'logo-2.png' هنا قمنا بإنشاء كائن يشير لملف جديد إسمه
		# لتحديد أننا نتعامل مع ملف غير نصي 'b' للإشارة إلى أننا سنستخدم هذا الكائن لكتابة في الملف بعد أن يتم إنشاؤه, و وضعنا الرمز 'w' وضعنا الرمز 
		new_file = open('logo-2.png', 'wb')

		# read() الذي يشير للصورة الأولى بواسطة الدالة existing_file هنا قمنا بقراءة محتوى الكائن 
		# الذي يشير للصورة الثانية new_file و من ثم تخزين النص الذي ترجعه في الكائن 
		new_file.write(existing_file.read())

		# لإغلاق الإتصال مع الملفين المفتوحين في الذاكرة new_file و existing_file من الكائن close() هنا قمنا باستدعاء الدالة
		existing_file.close()
		new_file.close()
	  

بعد تشغيل الملف Test.py سيتم نسخة مطابقة من الصورة logo.png إسمها logo-2.png في نفس المشروع.

 طريقة إنشاء كائن يسمح بالكتابة و القراءة من الملف في وقت واحد في بايثون

تذكر: الرمز a الذي نضعه في الدالة open() يعتبر إختصار للكلمتين Read & Write, و هو يستخدم لفتح الملف مع إمكانية القراءة منه و الكتابة فيه في نفس الوقت.


مثال

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لإضافة نص جديد على النص الموجود في الملف 'a' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'a+')

		# لإضافة نص جديد في الملف الذي يشير إليه opened_file من الكائن write() هنا قمنا باستدعاء الدالة
		opened_file.write('\nhis new text')

		# للرجوع إلى أول حرف في الملف الذي يشير إليهopened_file من الكائن seek() هنا قمنا باستدعاء الدالة
		opened_file.seek(0, 0)

		# الذي يشير للملف المفتوح حتى ترجع النص الموجود فيه, بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
		print(opened_file.read())

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

إذا قمت بتشغيل الملف Test.py و لم يحدث أي مشكلة, ستجد أن الملف demo.txt أضيف فيه النص "This new text" على سطر جديد.
كما أننا سنحصل على النتيجة التالية عند التشغيل.

Old text in the file.     <-- إفترضنا أن هذا السطر كان موجود في الملف
This new text

 الدالة write()

تعريفها

تستخدم للكتابة في الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.



بناؤها

                  write(string)
	


باراميترات

مكان الباراميتر string نمرر النص الذي نريد أن يتم كتابته في الملف.


قيمة الإرجاع

لا ترجع قيمة.


مثال

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لكتابة نص جديد في الملف 'w' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'w')

		# لكتابة نص جديد في الملف الذي يشير إليه opened_file من الكائن write() هنا قمنا باستدعاء الدالة
		opened_file.write('This new text will replace the old text.')

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم إنشاء ملف إسمه demo.txt في نفس المشروع الذي نعمل فيه و بداخله النص التالي.

This new text will replace the old text.

 الدالة writelines()

تعريفها

تستخدم لكتابة مجموعة نصوص مخزنة في list في الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.



بناؤها

                  writelines(aList)
	


باراميترات

مكان الباراميتر aList نمرر كائن list فيه مجموعة النصوص التي نريد أن يتم كتابتها بنفس الترتيب في الملف.


قيمة الإرجاع

لا ترجع قيمة.


مثال

Test.py
                    aList = ['text 1\n', 'text 2\n', 'text 3\n']

		# للإشارة إلى أننا سنستخدم هذا الكائن لكتابة نص جديد في الملف 'w' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'w')

		# في الملف الذي يشير إليه aList لكتابة قيم عناصر الكائن opened_file من الكائن writelines() هنا قمنا باستدعاء الدالة
		opened_file.writelines(aList)

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم إنشاء ملف إسمه demo.txt في نفس المشروع الذي نعمل فيه و بداخله النص التالي.

text 1
text 2
text 3

 الدالة read()

تعريفها

تستخدم للقراءة من الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.
إذا قمت باستدعائها و لم تمرر لها أي رقم, سترجع كل النص الموجود في الملف دفعة واحد.



بناؤها

                  read(n = -1)
	


باراميترات

n هو باراميتر إختياري يمكنك أن تمرر مكانه رقم يمثل عدد الأحرف التي تريد قراءتها من الملف في حال لم ترد أن تقرأ كل محتوى الملف دفعة واحدة. مع الإشارة إلى أنك في كل مرة تقوم فيها باستدعائها ستعطيك الأحرف التالية الموجودة في الملف.


قيمة الإرجاع

ترجع النص الموجود في الملف.


في المثال التالي قمنا باستخدام الدالة read() لقراءة كل النص الموجود في الملف دفعة واحدة.

المثال الأول

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لقراءة النص الموجود في الملف 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'r')

		# الذي يشير للملف المفتوح حتى ترجع كل النص الموجود فيه, بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
		print(opened_file.read())

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم طباعة كل النص الموجود في الملف demo.txt الذي إفترضنا أننا أنشأناه في نفس المشروع الذي نعمل فيه.

Python is an easy language to learn.     <-- هنا افترضنا أن هذا النص كان موجوداً أصلاً في الملف


في المثال التالي قمنا باستخدام الدالة read() لقراءة خمسة أحرف من الملف في كل مرة نستدعيها فيها.

المثال الثاني

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لقراءة النص الموجود في الملف 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'r')

		# الذي يشير للملف المفتوح و في كل مرة جعلناها ترجع 5 أحرف جديدة. بعدها قمنا بطباعة هذه الأحرف opened_file أربع مرات من الكائن read() هنا قمنا باستدعاء الدالة
		print(opened_file.read(5))
		print(opened_file.read(5))
		print(opened_file.read(5))
		print(opened_file.read(5))

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py, في كل مرة يتم فيها إستدعاء الدالة read() سترجع الخمس أحرف التالية الموجودة في الملف demo.txt الذي إفترضنا أننا أنشأناه في نفس المشروع الذي نعمل فيه.

Pytho
n is
an ea
sy la

 الدالة readline()

تعريفها

تستخدم للقراءة سطراً سطراً من الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها.
إذا قمت باستدعائها و لم تمرر لها أي رقم, سترجع السطر التالي الموجود في الملف.



بناؤها

                  readline(limits = -1)
	


باراميترات

limits هو باراميتر إختياري يمكنك أن تمرر مكانه رقم يمثل عدد الأحرف التي تريد قراءتها من السطر التالي في الملف في حال لم ترد أن تقرأ كل محتوى السطر دفعة واحدة. مع الإشارة إلى أنك في كل مرة تقوم فيها باستدعائها ستعطيك الأحرف الموجودة حتى نهاية السطر الحالي في الملف.


قيمة الإرجاع

ترجع السطر التالي الموجود في الملف.


في المثال التالي قمنا باستخدام الدالة readline() لقراءة كل النص الموجود في الملف دفعة واحدة.

المثال الأول

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لقراءة النص الموجود في الملف 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'r')

		# الذي يشير للملف المفتوح لكي ترجع سطر جديد منه في كل مرة. بعدها قمنا بطباعة السطر الذي ترجعه opened_file ثلاث مرات من الكائن readline() هنا قمنا باستدعاء الدالة
		print(opened_file.readline())
		print(opened_file.readline())
		print(opened_file.readline())

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم طباعة أول ثلاث أسطر موجودة في الملف demo.txt الذي إفترضنا أننا أنشأناه في نفس المشروع الذي نعمل فيه.

First line

Second line

Third line


في المثال التالي قمنا باستخدام الدالة readline() لقراءة ستة أحرف موجودة على نفس السطر في الملف في كل مرة نستدعيها فيها.

المثال الثاني

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لقراءة النص الموجود في الملف 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'r')

		# الذي يشير للملف المفتوح و في كل مرة جعلناها ترجع 6 أحرف جديدة من السطر الحالي. بعدها قمنا بطباعة هذه الأحرف opened_file ثلاث مرات من الكائن readline() هنا قمنا باستدعاء الدالة
		print(opened_file.readline(6))
		print(opened_file.readline(6))
		print(opened_file.readline(6))

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py, في كل مرة يتم فيها إستدعاء الدالة readline() سترجع الستة أحرف التالية الموجودة على نفس أسطر في الملف demo.txt الذي إفترضنا أننا أنشأناه في نفس المشروع الذي نعمل فيه.

First
line 

Second

 الدالة readlines()

تعريفها

تستخدم لإرجاع نسخة من النص الموجود في الكائن الذي يمثل الملف المفتوح الذي قام باستدعائها ككائن list.
كل عنصر في كائن الـ list الذي ترجعه يمثل سطر موجود في الملف.
إذا قمت باستدعائها و لم تمرر لها أي رقم, سيتم وضع كل الأحرف الموجودة على كل سطر في الملف في عنصر من عناصر الكائن الـ list.



بناؤها

                  readlines(limits = -1)
	


باراميترات

limits هو باراميتر إختياري يمكنك أن تمرر مكانه رقم يمثل عدد الأحرف التي تريد قراءتها من كل سطر في الملف في حال لم ترد أن تقرأ كل محتوى السطر.



قيمة الإرجاع

ترجع نسخة من النص الموجود في ككائن list, كل عنصر فيه عبارة عن سطر في الملف.


في المثال التالي قمنا باستخدام الدالة readlines() لقراءة كل النص الموجود في الملف دفعة واحدة و إرجاعه ككائن list.

المثال الأول

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لقراءة النص الموجود في الملف 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'r')

		# الذي يشير للملف المفتوح لكي ترجعه ككائن opened_file من الكائن readlines() هنا قمنا باستدعاء الدالة
		# كل عنصر فيه عبارة يحتوي على سطر من الأسطر الموجودة في الملف. بعدها قمنا بطباعته كما هو list
		print(opened_file.readlines())

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم طباعة أول ثلاث أسطر موجودة في الملف demo.txt الذي إفترضنا أننا أنشأناه في نفس المشروع الذي نعمل فيه.

['First line\n', 'Second line\n', 'Third line']


في المثال التالي قمنا بإنشاء حلقة for تعرض محتوى الملف سطراً سطراً.

المثال الثاني

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لقراءة النص الموجود في الملف 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'r')

		# الذي يشير للملف المفتوح لكي ترجعه ككائن opened_file من الكائن readlines() هنا قمنا باستدعاء الدالة
		# كل عنصر فيه عبارة يحتوي على سطر من الأسطر الموجودة في الملف. بعدها قمنا بطباعته كما هو list
		# و من ثم طباعة قيمته line و تخزين العنصر بشكل مؤقت في المتغير list بعدها قمنا بالمرور على كل عنصر في الكائن
		for line in opened_file.readlines():
		print(line)

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم طباعة كل سطر موجود في الملف demo.txt الذي إفترضنا أننا أنشأناه في نفس المشروع الذي نعمل فيه.

First line

Second line

Third line

 الدالة tell()

تعريفها

ترجع رقم آخر حرف في الملف تم الوصول إليه أثناء القراءة من الملف عن طريق الكائن الذي يمثل هذا الملف.



بناؤها

                  tell()
	


باراميترات

لا تقبل أي باراميتر.


قيمة الإرجاع

ترجع رقم آخر حرف في الملف تم الوصول إليه أثناء القراءة من الملف.


في المثال التالي قمنا باستخدام الدالة tell() في كل مرة قمنا فيها بقراءة بعض الأحرف من الملف.

مثال

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لقراءة النص الموجود في الملف 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'r')

		# الذي يشير للملف المفتوح حتى ترجع أول 5 أحرف موجودة في النص, بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
		print('Characters read:', opened_file.read(5))

		# من جديد read() هنا قمنا بطباعة رقم آخر حرف في النص تم طباعته و الذي سيتم الطباعة من بعده عند استدعاء الدالة
		print('Current file position:', opened_file.tell())

		# الذي يشير للملف المفتوح حتى ترجع ثاني 5 أحرف موجودة في النص, بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
		print('Characters read:', opened_file.read(5))

		# من جديد read() هنا قمنا بطباعة رقم آخر حرف في النص تم طباعته و الذي سيتم الطباعة من بعده عند استدعاء الدالة
		print('Current file position:', opened_file.tell())

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py, في كل مرة يتم فيها إستدعاء الدالة read() سترجع الخمس أحرف التالية الموجودة في الملف demo.txt الذي إفترضنا أننا أنشأناه في نفس المشروع الذي نعمل فيه.

Characters read: Self
Current file position: 5
Characters read: study
Current file position: 10

 الدالة seek()

تعريفها

أثناء القراءة من الملف عن طريق الكائن الذي يمثل هذا الملف, يمكنك إستخدام هذه الدالة في حال أردت الرجوع إلى الوراء في الملف لقراءة الملف من جديد على سبيل المثال.



بناؤها

                  seek(offset, from_what=0)
	


باراميترات

  • from_what هو باراميتر إختياري يمكنك أن تمرر إحدى الأرقام التالية مكانه:

    • الرقم 0 إذا أردت الرجوع إلى أول حرف في الملف.

    • الرقم 1 إذا أردت البقاء عند حرف الحالي الذي وصلت إليه في الملف.

    • الرقم 2 إذا أردت الذهاب إلى آخر حرف في الملف.

  • مكان الباراميتر offset تمرر رقم يمثل بعد كم حرف نسبة للبراميتر from_what تريد أن تبدأ.



قيمة الإرجاع

لا ترجع قيمة.


في المثال التالي قمنا باستخدام الدالة seek() للعودة إلى أول الملف بعد أن كنا قد قمنا بقراءة بعد الأحرف منه.

مثال

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لقراءة النص الموجود في الملف 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'r')

		# الذي يشير للملف المفتوح حتى ترجع أول 10 أحرف موجودة في النص, بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
		print('Characters read:', opened_file.read(10))

		# من جديد read() هنا قمنا بطباعة رقم الحرف الذي سيتم الطباعة من بعده عند استدعاء الدالة
		print('Current file position:', opened_file.tell())

		# و تمرير القيمتين 0 و 0 لها للرجوع إلى الحرف الأول في الملف opened_file من الكائن seek() هنا قمنا باستدعاء الدالة
		opened_file.seek(0, 0)

		# من جديد read() هنا قمنا بطباعة رقم الحرف الذي سيتم الطباعة من بعده عند استدعاء الدالة
		print('Current file position:', opened_file.tell())

		# الذي يشير للملف المفتوح حتى ترجع نفس الـ 10 أحرف السابقة, بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
		print('Characters read again:', opened_file.read(10))

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py, في كل مرة يتم فيها إستدعاء الدالة read() سترجع الخمس أحرف التالية الموجودة في الملف demo.txt الذي إفترضنا أننا أنشأناه في نفس المشروع الذي نعمل فيه.

Characters read: Self study
Current file position: 10
Current file position: 0           <-- seek() الموقع 0 في الملف يعني أننا عدنا لأول الملف و هذا طبعاً حدث بسبب إستدعاء الدالة
Characters read again: Self study

 الدالة close()

تعريفها

تستخدم لإغلاق الإتصال مع الملف و تنظيف الذاكرة من كل ما له علاقة بهذا الملف.
ملاحظة: في حال قمت بفتح الملف بالأساس بواسطة الجملة with فلا داعي لإغلاق الملف لأنها تقوم بإغلاقه بشكل تلقائي عنك.



بناؤها

                  close()
	


باراميترات

لا تقبل أي باراميتر.


قيمة الإرجاع

لا ترجع قيمة.


في المثال التالي قمنا باستخدام الدالة close() لإغلاق الملف المفتوح في الذاكرة بعد الإنتهاء من القراءة منه.

مثال

Test.py
                    # للإشارة إلى أننا سنستخدم هذا الكائن لقراءة النص الموجود في الملف 'r' و وضعنا الرمز 'demo.txt' هنا قمنا بإنشاء كائن يشير لملف إسمه
		opened_file = open('demo.txt', 'r')

		# الذي يشير للملف المفتوح حتى ترجع كل النص الموجود فيه, بعدها قمنا بطباعة النص الذي سترجعه opened_file من الكائن read() هنا قمنا باستدعاء الدالة
		print(opened_file.read())

		# لإغلاق الإتصال مع الملف المفتوح في الذاكرة opened_file من الكائن close() هنا قمنا باستدعاء الدالة
		opened_file.close()
	  

بعد تشغيل الملف Test.py سيتم طباعة كل النص الموجود في الملف demo.txt الذي إفترضنا أننا أنشأناه في نفس المشروع الذي نعمل فيه.

Python is an easy language to learn.     <-- هنا افترضنا أن هذا النص كان موجوداً أصلاً في الملف

 الدالة rename()

تعريفها

تستخدم لتغيير إسم الملف.



بناؤها

                  os.rename(current_file_name, new_file_name)
	


باراميترات

  • مكان الباراميتر current_file_name نمرر إسم الملف الذي نريد تغيير إسمه.

  • مكان الباراميتر new_file_name نمرر الإسم الجديد الذي نريد وضعه للملف.



قيمة الإرجاع

لا ترجع قيمة.


مثال

Test.py
                    # حتى نستطيع استخدام الدوال الموجودة فيه os هنا قمنا بتضمين الموديول
		import os

		# 'my-demo.txt' إلى 'demo.txt' لتغيير إسم الملف rename() هنا قمنا باستدعاء الدالة
		os.rename('demo.txt', 'my-demo.txt')
	  

بعد تشغيل الملف Test.py سيتم تغيير إسم الملف demo.txt الذي إفترضنا أننا أنشأناه في نفس المشروع الذي نعمل فيه إلى my-demo.txt.

 الدالة remove()

تعريفها

تستخدم لمسح الملف.



بناؤها

                  os.remove(file_name)
	


باراميترات

مكان الباراميتر file_name نمرر إسم الملف الذي نريد حذفه.



قيمة الإرجاع

لا ترجع قيمة.


مثال

Test.py
                    # حتى نستطيع استخدام الدوال الموجودة فيه os هنا قمنا بتضمين الموديول
		import os

		# 'demo.txt' لمسح الملف remove() هنا قمنا باستدعاء الدالة
		os.remove('demo.txt')
	  

بعد تشغيل الملف Test.py سيتم مسح الملف demo.txt الذي إفترضنا أننا أنشأناه سابقاً في نفس المشروع.

 الدالة path.exists()

تعريفها

تستخدم لمعرفة ما إن كان الملف موجوداً أم لا.



بناؤها

                  os.path.exists(file_name)
	


باراميترات

مكان الباراميتر file_name نمرر إسم الملف الذي نريد التأكد ما إن كان موجوداً أم لا.



قيمة الإرجاع

ترجع True إذا كان الملف موجوداً. و ترجع False إن لم يكن كذلك.


مثال

Test.py
                    # حتى نستطيع استخدام الدوال الموجودة فيه os هنا قمنا بتضمين الموديول
		import os

		# 'Test.py' موجوداً في نفس المكان الموجود فيه الملف 'demo.txt' لمعرفة ما إن كان الملف path.exists() هنا قمنا باستدعاء الدالة
		os.path.exists('demo.txt')
	  

بعد تشغيل الملف Test.py سيتم طباعة القيمة True إذا كالتالي إذا كان عندك في نفس المشروع ملف إسمه demo.txt.
إذا لم يتم إيجاد ملف إسمه demo.txt سيتم طباعة القيمة False.

 الدالة mkdir()

تعريفها

تستخدم لإنشاء مجلد جديد.
معلومة: إسم الدالة هو إختصار لجملة Make Directory.



بناؤها

                  os.mkdir(directory_name)
	


باراميترات

مكان الباراميتر directory_name نمرر إسم المجلد الذي نريد إنشاؤه.



قيمة الإرجاع

لا ترجع قيمة.


مثال

Test.py
                    # حتى نستطيع استخدام الدوال الموجودة فيه os هنا قمنا بتضمين الموديول
		import os

		# 'images' لإنشاء مجلد إسمه mkdir() هنا قمنا باستدعاء الدالة
		os.mkdir('images')
	  

بعد تشغيل الملف Test.py سيتم إنشاء مجلد إسمه images في نفس المشروع.

 الدالة rmdir()

تعريفها

تستخدم لمسح المجلد.
ملاحظة: يمكنك حذف المجلد في حال كان فارغاً فقط, أي في حال لم يكن يحتوي على أي ملف بداخله.
معلومة: إسم الدالة هو إختصار لجملة Remove Directory.



بناؤها

                  os.rmdir(directory_name)
	


باراميترات

مكان الباراميتر directory_name نمرر إسم المجلد الذي نريد حذفه.



قيمة الإرجاع

لا ترجع قيمة.


مثال

Test.py
                    # حتى نستطيع استخدام الدوال الموجودة فيه os هنا قمنا بتضمين الموديول
		import os

		# 'images' لإنشاء مجلد إسمه rmdir() هنا قمنا باستدعاء الدالة
		os.rmdir('images')
	  

بعد تشغيل الملف Test.py سيتم مسح مجلد إسمه images إفترضنا أنه كان موجود في نفس المشروع.

 الدالة getcwd()

تعريفها

تستخدم لمعرفة إسم المجلد الذي تقف بداخله حالياً.
معلومة: إسم الدالة هو إختصار لجملة Get Current Working Directory.



بناؤها

                  os.getcwd()
	


باراميترات

لا تقبل أي باراميتر.



قيمة الإرجاع

ترجع المسار الذي تقف بداخله حالياً.


مثال

Test.py
                    # حتى نستطيع استخدام الدوال الموجودة فيه os هنا قمنا بتضمين الموديول
		import os

		# بعدها قمنا بطباعته .'Test.py' لترجع لنا إسم المجلد الموجود فيه الملف getcwd() هنا قمنا باستدعاء الدالة
		print(os.getcwd())
	  

ستحصل على نتيجة تشبه النتيجة التالية عند التشغيل على حسب المسار الموجود فيه الملف Test.py على حاسوبك.

C:\Users\Mhamad\PycharmProjects\myapp


 خطوتك التالية بعد تعلم لغة بايثون

مقدمة

إذا قمت بقراءة كل الدروس التي شرحناها في هذه الدورة و وصلت إلى هنا, فهذا يعني أنك أصبحت ماهراً في التعامل مع لغة بايثون.
الشيء الذي عليك البحث عنه الآن, هو كيف تبدأ باستخدام لغة بايثون في المشاريع البرمجية من أجل أن تستفيد منها مادياً.

ماذا أتعلم بعد أن تعلمت لغة بايثون

في البداية, هناك مجالات عديدة يجب أن تتخصص بأحدها و ليس فيها كلها لأن هذا مستحيل.
أي لا تفكر أبداً بأن تتخصص في عدة مجالات في وقت واحد. لأنك إن حاولت ذلك فـأكد أنك في مرحلة ما ستيأس و تمل من شدة الضغط الذي سببته لنفسك.


إذاً, بعد أن تتعلم لغة بايثون, يمكنك إعتمادها في أحد المجالات التالية:

  • تطوير المواقع (Web Development).

  • الذكاء الإصطناعي (Artifical Intelligence).

  • تطوير تطبيقات للحاسوب (Software Development).

  • مؤثرات الألعاب (Animations).

  • تجهيز سكريبتات لتسريع عملك (Scripting).


إنتبه, تخصصك في مجال واحد لا يعني أنك لا تستطيع تعلم غيره. الفكرة هنا هي أن تتخصص في مجال واحد في كل مرة.
فعلى سبيل المثال, إذا قررت البدء بتعلم تطوير تطبيقات للحاسوب. عندها يجب أن تقضي فترة في تعلم ذلك و من ثم يجب أن تحاول بناء عدة تطبيقات بنفسك حتى تجد نفسك مرتاحاُ في هذا المجال و لا تخاف من البدء بتطوير تطبيقات و الربح منها مادياً.

بعد أن تجد نفسك أصبحت محترفاً في مجال تطوير تطبيقات الحاسوب, عندها نحن ننصحك بالبدء بتعلم مجال آخر من أجل أن تزيد فرصك في العمل و الربح.
فمثلاً إذا قررت تعلم تطوير المواقع بعد ذلك, فأنت الآن أصبحت قادر على العمل في مجالين و ليس في مجال واحد.

تطوير المواقع باستخدام لغة بايثون

إذا أردت الدخول في مجال تطوير المواقع, فعليك أولاً معرفة أي سيكون دور لغة بايثون في ذلك.
تطوير المواقع ينقسم لقسمين أساسيين: Front End و Back End.


قسم الـ Front End

يقصد منه تصميم الموقع و هذا لا علاقة له بلغة بايثون. و بشكل عام تحتاج معرفة الأشياء الأساسية التالية لمعرفة كيف تصمم أي موقع بنفسك من الصفر:

  • لغة HTML: هذه اللغة تستخدم لتحديد الأشياء التي تريد عرضها في الموقع مثل العناوين, الصور, الفيديوهات الخ..

  • لغة CSS: هذه اللغة تستخدم لتحسين تصميم و طريقة ظهور الأشياء التي تريد عرضها في الموقع.

  • لغة Javascript: هذه اللغة تستخدم لإضافة مؤثرات جميلة في الموقع.

  • مكتبة JQuery: من أجل كتابة كود الـ Javascript بشكل أسهل و مختصر.

  • مكتبة Bootstrap: من أجل جعل التصميم يتوافق مع حجم شاشة أي جهاز يتم تصفح الموقع من خلاله و هي توفر عليك جهد كبير جداً في التصميم.

  • مكتبة FontAwesome: لإضافة أيقونات رائعة في الموقع بكل سهولة.



قسم الـ Back End

في هذا القسم تستخدم لغة بايثون من أجل جعل ربط تصميم الموقع بقاعدة البيانات و كتابة كل الأوامر التي علاقها بإدارة البيانات.

بالنسبة لقواعد البيانات
تستطيع إستخدام أي قاعدة بيانات تريد مثل MySQL, SQL Server, Oracle إلخ..

بالنسبة للغة بايثون
تستطيع إستخدام أي إطار ( Framework ) جاهز تريد مثل Django, Pyramid, Flask إلخ.. لعلك تتساءل الآن لم يجب استخدام إطار بدل استخدام لغة بايثون بشكل مباشر!
عند استخدام إطار فأنت تريح رأسك من أشياء كثيرة مثل: الكود آمن و ليس فيه ثغرات, ستجد دوال و كلاسات كثيرة جاهزة يمكنك استخدامها كما هي بدل الإضطرار إلى كتابتها من الصفر, أي سؤال يخطر في بالك ستجد أجوبة له كثيرة في جوجل إلخ..

إذا كنت حائراً و لا تعرف أي قاعدة بيانات أو إطار بايثون أنسب لك, فيمكنك استخدام قواعد بيانات MySQL و الإطار Django لأنهما الأكثر شهرة.

بعد تعلم كل ما سبق, تصبح قادر على بناء أي موقع يخطر في بالك و العمل كمطور مواقع إن شاء الله.


الآن, في حال أردت تطوير نفسك أكثر في مجال الويب, يمكنك تعلم بناء تطبيقات ويب بدل بناء مواقع ويب تقليدية.
تطبيقات الويب لها عدة مميزات و أهمها أنها تجعلك قادر على تحويل الموقع إلى تطبيق يعمل على الهاتف و هذا الأمر يمكنه أن يؤمن لك فرص كثيرة أخرى للربح.

لبناء تطبيق ويب, سيكون عليك بالإضافة لم تعرفه سابقاً أن تتعلم استخدام إطار آخر من جهة Front End فقط.
أشهر الأطر المستخدمة حالياً لبناء تطبيقات ويب هي: Angular, Vue و React.

إستخدام لغة بايثون في الذكاء الإصطناعي

في البداية, عليك معرفة أن أفضل مجال لإستخدام لغة بايثون و أكثر سبب لشهرتها هو شهرتها في هذا المجال.
فكرة الذكاء الإصطناعي بشكل عام هي بناء برنامج قادر على إتخاذ القرارات و كأنه إنسان عادي!

لا بد و أنك تتساءل الآن حول كيف يمكن جعل البرنامج قادر على التفكير من تلقاء ذاته و هذا سؤال منطقي.
الذكاء الإصطناعي لا يعني أبداً جعل البرنامج يفكر و يتصرف تماماً من تلقاء ذاته, بل جعله يعتمد الأسلوب الذي يعتمده الناس في التصرف و اتخاذ القرارات.

سنحاول شرح طريقة عمل الذكاء الإصطناعي من خلال المثال التالي:
لنفترض أنه يوجد مستشفى يقوم يومياً بإلتقاط عدة صور أشعة لصدور المرضى, و من ثم يأتي الطبيب و ينظر إلى هذه الصورة فيكتب تقرير مفصل عنها.
بعدها يتم حفظ كل صورة مع التقرير الخاص بها في قاعدة بيانات المستشفى.
بعد مرور 5 سنوات على سبيل المثال, سيصبح لدى المستشفى قاعدة بيانات فيها آلاف الصور مع التقارير الخاصة بها.
بعد أن أصبح المستشفى يملك كم هائل من المعلومات, أصبح بإمكان هذه المستشفى الإستفادة من الذكاء الإصطناعي و إدخاله في عملها.
الآن, أصبح بإمكان المبرمج أن يجعل أي صورة أشعة يتم إلتقاتها تقارن مع الصور الموجودة في قاعدة البيانات و على أساس أكثر صورة أو صور مشابهة لها يتم طباعة التقرير للصورة الجديدة التي تم إلتقاطها.
فمثلاً بعد المقارنة, قد يجد البرنامج أنه يوجد إحتمال بنسبة 98% أن يكون هذا المريض يعاني من مشكلة معينة لأن أغلب الصور المشابهة لها تعاني من نفس المشكلة.
عندها و بشكل مباشر سيقوم البرنامج بإعطائك التقرير المفصل لهذه الصورة و كأنه قد قام شخص ما بإعداد هذا التقرير.

في النهاية, نتوصل أنه كلما تم تمديد البرنامج بمعلومات أكثر, كلما حصلنا على معلومات أدق.
و كخلاصة للموضوع كله, الذكاء الإصطناعي يبني قراراته على أساس المعلومات التي تموله بها أو التي قمت سابقاً بتجهزيها له.


مجال الذكاء الإصطناعي ينقسم بدوره لعدة فروع يمكنك تعلم إحداها مثل:

  • التعلم الآلي ( Machine Learning ) : يرتكز على جعل الآلة تحفظ المعلومات التي تسجلها من تلقاء نفسها ثم بناءاً على هذه المعلومات و الخوارزميات التي تعتمدها تعطيك النتيجة. فمثلاً, عند البحث في جوجل تجده بشكل تلقائي يظهر لك خيارات أثناء إدخال المعلومات التي تريد البحث عنها. هذه الخيارات تم تخزينها في الأصل بشكل تلقائي عندما قام أشخاص قبلك بالبحث كما تفعل أنت الآن.

  • الروبوتات الذكية ( Robotics ) : يرتكز على بناء آلات تجمع المعلومات من تلقاء ذاتها باعتماد خوارزميات معينة و من ثم تتصرف أو تؤدي المهمات التي تطلب منها على أساس المعلومات التي تعلمتها بنفسها. فمثلاً إذا طلبت من روبوت أن يصعد إلى الدرج, فإنه قد يقضي بعض الوقت في المرة الأولى و هو يجرب كيف يجب أن يتحرك حتى يصعد الدرج بنجاح. في النهاية و بعد أن يتوصل للطريقة الصحيحة التي يجب أن يتحرك بها لصعود الدرج فإنه عندما يريد صعوده في المرة المقبلة سيستخدم بسرعة نفس الأسلوب الذي تعلمه بنفسه سابقاً.

  • الرؤية ( Vision ) : يرتكز على جعل الآلة قادرة على معرفة طبيعة الأجسام التي تصورها و تحليلها, فمثلاً إذا قمت بإلتقاط صورة لقنينة ماء, فإنها قادرة على معرفة أن ما في الصورة عبارة عن قنينة بل و أن هذه القنينة ممتلئة على سبيل المثال بنسبة 80%. كمثال آخر, عندما تقوم بإضافة صورة على فيسبوك, فإن فيسبوك تجده بشكل تلقائي يضع علامة على الوجوه, بل و يخبرك أحياناً أن الشخص الذي في الصورة هو فلان و يسألك إن كنت تريد أن تفعل له منشين.

  • التخطيط ( Planning ) : يستخدم كثيراً في الألعاب حيث يتيح لك تحريك الشخصيات بشكل تلقائي. مثلاً لجعل الأشرار في اللعبة يقتربوا منك أو يهربوا منك إلخ.

  • معالجة الصوت ( Speech Processing ) : جعل الآلة قادرة على فهم الأصوات و تحويلها إلى كلام أو جعل لنطق الكلام المكتوب.


ملاحظة

ما قمنا بذكره عن مجالات الذكاء الإصطناعي يعتبر سطحي جداً لأن هذا المجال ضخم و مجالاته كثيرة.


ما هي الاشياء التي يجب معرفتها قبل الدخول في مجال الذكاء الإصطناعي

من الناحية البرمجية فيجب أن تعرف لغة بايثون و طريقة التعامل مع قواعد البيانات.
من ناحية أخرى فهذا المجال يتطلب مهارة كبيرة في الرياضيات إذا كان الشخص ينوي أن يبدع فيه.

من ناحية الرياضيات, يجب دراسة المواد التالية كبداية و التي يدرسها الطلاب في الجامعات:

  • Linear Algebra.

  • Calculus.

  • Probability and Statistics.

  • Discrete Mathematics.

  • Mathematical Logic.

في هذا الرابط تجد صور مبسطة جداً من شأنها أن توضح لك علاقة هذه المواد و أهميتها بالذكاء الإصطناعي يمكنك مشاهدته الموقع انقر هنا

تطوير تطبيقات للحاسوب باستخدام لغة بايثون

في بايثون يوجد أطر ( Frameworks ) عديدة يمكنك إستخدامها لبناء تطبيقات للحاسوب أو ما يعرف بتطبيقات سطح المكتب ( Desktop Apps ).


أشهر الأطر المستخدمة حالياً في بناء تطبيقات للحاسوب هي التالية:

  • Tkinter: يأتي مع ملفات بايثون نفسها.

  • Kivy: إطار مجاني يمكن استخدامه لبناء تطبيقات تعمل على نظام Windows, MacOSX, Android, IOS, Raspberry Pi.

  • PyQT: إطار يمكن استخدامه لبناء تطبيقات تعمل على نظام Windows, Unix/Linux و MacOSX. كما أنه يوجد منه نسخة مجانية و نسخة مدفوعة.

  • WxPython: إطار مجاني يمكن استخدامه لبناء تطبيقات شبيهة بالتطبيقات المنصبة على الجهاز ( Native Apps ) و تعمل على نظام Windows, MacOSX, Unix.

إستخدام لغة بايثون لإعداد مؤثرات للألعاب

في حال كنت من هواة تصميم الألعاب فيمكنك استخدام برنامج Blender المجاني لبناء الشخصيات و المؤثرات و حتى بناء مقاطع رسوم متحركة و ألعاب بسيطة.
اللغة البرمجية المستخدمة في هذا البرنامج من أجل إضافة المؤثرات هي بايثون.

برنامج Blender له شعبية كبيرة و مميزات قوية حقاً نسبة لأنه مجاني و يمكنك إيجاد شروحات كثيرة له في النت بالإضافة إلى المجسمات و الشخصيات و المؤثرات المجانية المعدة بواسطته.

إستخدام لغة بايثون لبناء سكريبتات تستخدم مفيدة

في حال كنت تقوم بمهام يومية أو شبه يومية في حاسوبك فيمكنك تجهيز سكريبت يفعل هذه المهام بمجرد أن تقوم بتشغيله.
فمثلاً, في حال كنت تقوم بشكل يومي بإجراء نسخة ثانية من ملفات موضوعة في مجلد ما, أن كنت تنشر نفس المقالات في عدة مجموعات في فيسبوك, أو تبحث في جوجل عن مواعيد الصلوات الخمسة إلخ.. عندها يمكنك إعداد الكود مرة واحدة, و عند الحاجة لتنفيذه تقوم بتشغيله فقط فيقوم بنفس المهام التي كنت ستقوم بها بنفسك و لن تضطر إلى الإنظزار و إضاعة وقتك في إجراء نفس العمليات في كل يوم.

كيف أطور نفسي الآن و أجد المعلومات التي أحتاجها

في البداية, كل ما تم ذكره في هذا الدرس يوجد مقدمات و دروس جاهزة حوله في يوتيوب و جوجل باللغتين العربية و الإنجليزية.
و بالتالي في أحال أردت معرفة المزيد حول أي شيء ذكرناه سابقاً قم بالبحث عنه فقط و تأكد أنك ستجد ملايين الإجابات الجاهزة و المفصلة.


روابط دورات عربية و أجنبية
w3schools.com اللغة: الإنجليزية
يعتبر من أفضل المواقع على الإطلاق لتعلم اللغات الأساسية ( HTML, CSS, Javascript, JQuery, Bootstrap ) التي تستخدم في تصميم المواقع.
كما أنه يحتوي على دورة تعلمك طريقة إستخدام الأيقونات المجانية التي توفرها لك المكتبة FontAwesome.
Youtube: SQL Server اللغة: الإنجليزية
تعتبر من أفضل القنوات في يوتيوب لتعلم قواعد بيانات SQL Server من الصفر وصولاً لمستوى متقدم جداً فيها.
من مميزات هذه الدورة, أن الأستاذ يتطرق أيضاً للأسئلة التي يتم طرحها في مقابلات العمل.
Youtube: SQL Server اللغة: العربية
تعتبر من أفضل القنوات في يوتيوب لتعلم قواعد بيانات SQL Server من الصفر وصولاً لمستوى متقدم جداً فيها.
من مميزات هذه الدورة, أن الأستاذ يتطرق أيضاً للأسئلة التي يتم طرحها في مقابلات العمل. و هي نفس الدورة السابقة و لكنها مدبلجة للغة العربية.
Youtube: Flask اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات للإطار Flask.
Youtube: Pyramid اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات للإطار Pyramid.
Youtube: Tkinter اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات للإطار Tkinter.
Youtube: Kivy اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات للإطار Kivy.
Youtube: PyQT اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات للإطار PyQT.
Youtube: WxPython اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات للإطار WxPython.
Youtube: Blender اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات لبرنامج Blender.
Youtube: Machine Learning اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات في مجال Machine Learning.
Youtube: Robotics اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات في مجال Robotics.
Youtube: Vision اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات في مجال Vision.
Youtube: Speech Processing اللغة: الإنجليزية
جميع قنوات يوتيوب التي قدمت دورات في مجال Speech Processing.

للأسف لم نستطع إيجاد روابط لدورات عربية قوية و مجانية لأن أغلب المطورين العرب للأسف لا يشاركون خبراتهم مجاناً في يوتيوب.



رسالة من الموقع


 نتمنى دعمنا من خلال مشاركة الدورة مع أصدقائك في مواقع التواصل الإجتماعي و زملائك في الجامعة إذا كنت تجد أن هذه الدروس يمكنها إفادته.

نتمنى لك كل التوفيق و نسأل الله أن يوفقك و يبارك لك في علمك و عملك.